package deeloco.android.gastos.Movil.plus;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import deeloco.android.gastos.Movil.plus.broadcast.avisoEstadoTelefono;

import android.content.Context;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.provider.CallLog;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.Display;
import android.view.WindowManager;
import android.widget.ListView;

public class CosteLlamadas extends Thread{

	private Context contexto;
    private int mes;
    private Handler handler;
	
    private List<IconoYTexto> lista = new ArrayList<IconoYTexto>();
    private List<IconoYTexto> listaInvertida = new ArrayList<IconoYTexto>();
    private GastosPorNumero gpn=new GastosPorNumero();
    private GastosPorHora gph=new GastosPorHora();
    private ValoresPreferencias vp;
    private tarifas ts=new tarifas();
    private int numLlamadas;
    private double totalEstablecimiento;
    private double totalCosteLlamadas;
    private String fechaControl="01/01/1000"; 
    
    
	/**
	 * Contructor de la clase
	 * @param contexto
	 * @param mes
	 */
	public CosteLlamadas(Context contexto,Handler handler,int mes) {
		super();
		this.contexto = contexto;
		this.mes=mes;
		this.handler=handler;
	}

	/**
	 * @return the lista
	 */
	public List<IconoYTexto> getLista() {
		return lista;
	}


	/**
	 * @return the listaInvertida
	 */
	public List<IconoYTexto> getListaInvertida() {
        for (int a=lista.size()-1;a>=0;a--)
        	listaInvertida.add(lista.get(a));
		return listaInvertida;
	}




	/**
	 * @return the gpn
	 */
	public GastosPorNumero getGpn() {
		return gpn;
	}

	/**
	 * @return the gph
	 */
	public GastosPorHora getGph() {
		return gph;
	}

	/**
	 * @return the ts
	 */
	public tarifas getTs() {
		return ts;
	}


	/**
	 * @return the numLlamadas
	 */
	public int getNumLlamadas() {
		return numLlamadas;
	}
	
	/**
	 * @return the totalEstablecimiento
	 */
	public double getTotalEstablecimiento() {
		return totalEstablecimiento;
	}

	/**
	 * @return the totalCosteLlamadas
	 */
	public double getTotalCosteLlamadas() {
		return totalCosteLlamadas;
	}
	
	
	public String getFechaControl(){
		return fechaControl;
	}
	
	public int getMes() {
		return mes;
	}

	/* (non-Javadoc)
	 * @see java.lang.Thread#run()
	 */
	@Override
	public void run() {
		// TODO Auto-generated method stub
		//super.run();
		
		//Variables última llamada
		String ult_telefono="";
		String ult_fechaHora="";
		int ult_duracion=0;
		String ult_nombre="";
		double ult_coste=0.0;
		
		ts.cargarTarifas();
	    double costeLlamadas=0;
	    numLlamadas=0;
	    int mesListado; //Atributo privado donde se almacena el mes que se quiere listar. Cambiara cuando arrastre a la derecha o la izquierda
	    int mesListadoPreferencias; //Atributo privado donde se almacena el mes seleccionado en ajustes
	    ListView listallamadas;
	    int mesPrimero;
	    int mesUltimo;
	    int totalRegistros=0;
	    double iva=1.18;
	    Display display;
		
		vp=new ValoresPreferencias(contexto);
		
		
		//IVA a aplicar
		
		if(vp.getcosteConIVA())
			iva=1.0+((double)vp.getPreferenciasImpuestosPorCiento()/100.0);
		else
			iva=1.0;
		
		Log.d("IMPUESTOS","IMPUESTOS="+iva);
		
	    display = ((WindowManager) contexto.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    	//List<IconoYTexto> lista = new ArrayList<IconoYTexto>();
    	lista.clear();
    	listaInvertida.clear();
    	gpn.clear(); //limpiamos los gastos por numero (gpn)
    	gph.clear();
       Cursor c; //Cursor con el que recorreremos la base de datos de registros de llamadas
       
       
       
       if (mes==0) //Consulta de todo el año.
       {
    	   c=contexto.getContentResolver().query(CallLog.Calls.CONTENT_URI,null, CallLog.Calls.DURATION+">1 and "+CallLog.Calls.TYPE+"="+CallLog.Calls.OUTGOING_TYPE , null, "date ASC");
       }
       else
       {    	   
    	   
       /*Vamos a hacer una consulta de un mes concreto*/
    	/*De momento, para las pruebas, estamos utilizando 2009, pero hay que utilizar el año en curso, el mes, ... */
    	   // Seleccionado un mes, tenemos que saber a que año corresponde
    	   int valorIncioMes=vp.getPreferenciasInicioMes();
    	   Date hoy=new Date();
    	   int anyo=hoy.getYear()+1900;
    	   int mesActual=hoy.getMonth()+1;
    	   if (mesActual<mes)
    	   {
    		   anyo--;
    	   }
           Calendar c1=new GregorianCalendar(anyo,mes-1,valorIncioMes,0,0);
           Calendar c2=new GregorianCalendar(anyo,mes,valorIncioMes,0,0);
           
           Date d1=new Date();
           Date d2=new Date();
           d1=c1.getTime();
           d2=c2.getTime();
           
           //Hacemos la consulta
           //Log.d(TAG,"fecha D1="+d1);
           //Log.d(TAG,"fecha D2="+d2);
           c=contexto.getContentResolver().query(CallLog.Calls.CONTENT_URI,null, CallLog.Calls.DATE+"<="+(d2.getTime())+" and "+CallLog.Calls.DATE+">="+(d1.getTime())+" and "+CallLog.Calls.DURATION+">1 and "+CallLog.Calls.TYPE+"="+CallLog.Calls.OUTGOING_TYPE , null, "date ASC");      
       }

        //contexto.startManagingCursor(c);
        
        int iTelefono = c.getColumnIndex(CallLog.Calls.NUMBER);
        int iFecha = c.getColumnIndex(CallLog.Calls.DATE);
        int iDuracion = c.getColumnIndex(CallLog.Calls.DURATION);
        int iNombre = c.getColumnIndex(CallLog.Calls.CACHED_NAME);
        int iLabel = c.getColumnIndex(CallLog.Calls.CACHED_NUMBER_LABEL);
        //int iType = c.getColumnIndex(CallLog.Calls.CACHED_NUMBER_TYPE);
        
        
        //int modifDuracion=getPreferenciasDuracion(); //modificación de la duración de la llamada
        int modifDuracion=vp.getPreferenciasDuracion(); //modificación de la duración de la llamada
        costeLlamadas=0;
        double coste=0.0;
        double costeDia=0.0;
        double estLlamada=0;
        numLlamadas=0;
        double totalEstLlamadas=0;
        //String fechaControl="01/01/1000";
        String fechaHora;
		tarifa t=null;
		Franja f=null;
		Drawable rIcono = null;
        //boolean sw_limite=false;
		String telefono;
		String nombreLlamada;
		long fecha;
		int duracion;
		String viber;
        
        //Si hay algún elemento
        //AdaptadorListaIconos ad2 = new AdaptadorListaIconos(contexto,listaInvertida);
        //ListActivity.setListAdapter(ad2);
        c.moveToFirst();
        int totalLlamadas=c.getCount();
        ts.resetSegundos();

        if (c.isFirst()&&ts.numTarifas()>0)
        {		
        	do{
        		
        		telefono=FunGlobales.quitarPrePais(c.getString(iTelefono));
//        		telefono=c.getString(iTelefono);
        		nombreLlamada=c.getString(iNombre);
        		fecha=c.getLong(iFecha);
        		duracion=c.getInt(iDuracion)+modifDuracion; //le añadimos la modificación de la duración de la llamada;
        		viber=c.getString(iLabel);
        		
        		String sDuracion;
        		
        		fechaHora=DateFormat.format("dd/MM/yyyy kk:mm:ss",new Date(fecha)).toString();
        		String fechaHoy=fechaHora.substring(0, 10).trim();
        		//Si la duración es mayor que la duración modificada, se hace los cálculos.
        		if (duracion>modifDuracion)
        		{
	        		//t=tarifa a la que pertenece el número
	        		t=ts.getTarifa(telefono,fechaHora,contexto);
	        		//Si t=null no hay tarifa para el teléfono,fechayhora
	        		if (t!=null)
	        		{
	        			f=t.getFranja(fechaHora,contexto);
	        			//Si no tiene franja y t no es por defecto
	        			if (f==null&&!t.getDefecto())
	            		{
	        				//Forzamos a que compruebe con la que este definida 'por defecto'
	            			t=ts.getTarifa("999999999",fechaHora); 
	            			if (t!=null)
	                			f=t.getFranja(fechaHora);
	            		}
	        		}
	        		
	        		if (f!=null&&t!=null)
	        		{
	        			//El día y la hora pertenece a una franja
		        		//Log.d(TAG,"Nombre de la franja="+f.getNombre()+" -> Fecha y hora"+fechaHora);
		        		//Añadimos los acumulados de tiempo que se pueden añadir en este punto
	        			//Me esta dando un error en la consola del market. No se porque, pongo un try
	        			try
	        			{
			        		t.addSegConsumidosMes(duracion);
			        		f.addSegundosConsumidos(telefono, duracion);
	        			}catch (Exception e){
	        				Log.e("Gastos Movil","t.addSegConsumidosMes(duracion):"+e.getMessage());
	        				duracion=0;
	        			}
		        		//Comprobamos si estamos en el mismo día
		        		if (fechaControl.compareTo(fechaHoy)!=0)
		        		{
		        			//No estamos en el mismo día
		        			//Incluimos el resumen del día si se ha seleccionado en ajustes y si seg. consumidos del día > 1
		        			//Log.d("GAstos Móvil", "Segundos consumidos día="+ts.getSegConsumidosDia());
		        			if (ts.getSegConsumidosDia()>1&&vp.getResumenDia())
		        			{
		        				//Resumen día
		        				String Festivo="";
		            			if (t.esFestivo(fechaControl, vp.getDiasFestivos()))
		            			{
		            				Festivo="(Fest.)";
		            			}
		        				lista.add(new IconoYTexto(contexto.getResources().getDrawable(android.R.drawable.presence_away), " "," ", fechaControl+" "+FunGlobales.diaSemana(fechaControl)+Festivo,(ts.getSegConsumidosDia()/60)+"m."+(ts.getSegConsumidosDia()%60)+"s. ",FunGlobales.redondear((costeDia*iva),vp.getPreferenciasDecimales())));
		        			}
		        			//final MODIFICACIÓN POR CONFIRMAR
		        			ts.resetSegundosConsumidosDia();
		        			t.setSegConsumidosLimiteDia(0); //Se resetea
		        			costeDia=0.0;
		        			t.setSegConsumidosDia(duracion); //Segundos consumidos solo los de hoy
		        			fechaControl=fechaHoy;
		        		}
		        		else
		        		{
		            		
		            		t.addSegConsumidosDia(duracion);
		        		}
		        		//Añadimos los acumulados de limite, si la llamada esta en la franja del limite
		        		if (f.getLimite())
		        		{
		        			//La franja cuenta para el límite
		        			//Comprobar si la tarifa tiene limite mensual
		        			if (t.getLimite()>0)
		        			{
		        				//Cuenta, añadirlo al contador de limite mensual
		        				t.addSegConsumidosLimiteMes(duracion);
		        				
		        			}
		        			//Comprobar si la tarifa tiene limite diario
		        			if (t.getLimiteDia()>0)
		        			{
		        				//Cuenta, añadirlo al contador de limite diario
		        				t.addSegConsumidosLimiteDia(duracion);	
		        			}
		        			
		        		}
		        		
		        		coste=f.coste(t, duracion); //Coste sin iva
		        		costeDia+=coste;
		        		estLlamada=f.establecimiento(t);
		        		t.addCosteMes(coste);
		        		
		        		if (
	        				((t.getSegConsumidosLimiteDia()>t.getLimiteDia()*60)&&t.getLimiteDia()>0)||
	        				((t.getSegConsumidosLimiteMes()>t.getLimite()*60)&&t.getLimite()>0)||
	        				((duracion>t.getLimiteLlamada()*60)&&t.getLimiteLlamada()>0))
		        		{
		        			rIcono=vp.getColorIcon(t.getColor(),"relog_peligro",display.getHeight());
		        		}
		        		else
		        		{
		        			if (f.getLimite()) rIcono=vp.getColorIcon(t.getColor(),"relog_mas",display.getHeight()); 
		        			else rIcono=vp.getColor(t.getColor());
		        		}
  
	        			//Ya tenemos el coste y el numero y es una llamada > 0, lo metemos en GastosPorNumero
	            		gpn.add(telefono, coste,duracion);
	            		gph.add(new Date(fechaHora), coste);
	            		
	        			if (coste>0)
	        			{
	        				//estLlamada=(vp.getPreferenciasEstLlamadas()/coste)*100;
	        				estLlamada=(estLlamada/coste)*100;
	        				totalEstLlamadas=totalEstLlamadas+estLlamada;
	        			}
	        			sDuracion=(duracion/60)+"m."+(duracion%60)+"s.";
	        			
	        			if (vp.getEstablecimiento())
	        				fechaHora=fechaHora+" | "+FunGlobales.redondear(estLlamada,0)+"%";
	        			String nombre="";
	        			if (vp.getNombreAgenda()&&(nombreLlamada!=null))
	        				nombre=""+nombreLlamada;
	        				//nombre=getContactNumber(telefono);
	        			lista.add(new IconoYTexto(rIcono, telefono,nombre, fechaHora,sDuracion,FunGlobales.redondear((coste*iva),vp.getPreferenciasDecimales())));
	        			//valores acumulados
	        			costeLlamadas=costeLlamadas+coste;
	        			Message m=handler.obtainMessage();
	        			m.arg1=totalLlamadas;
	        			m.arg2=numLlamadas;
	        			this.handler.sendMessage(m);
	        			numLlamadas++;

	        			
	        		}
		    		else
		    		{
		    			//El día y la hora no pertenecen a ninguna franja
		    			rIcono=vp.getColor("Transparente");
		    			lista.add(new IconoYTexto(rIcono, telefono,"SIN FRANJA", fechaHora,(duracion/60)+"m."+(duracion%60)+"s.",-1.0));
		    			
		    		}
	        		
	        		//Guardamos los datos de la última llamada en preferencias para que se pueda mostrar en el widget, siempre que el mes que se este mostrado sea el mismo
	        		//que es usuario ha seleccionado en ajustes.
	        		//QUITAR
	        		if (mes==vp.getPreferenciasMes())
	        		{
	        			ult_telefono=telefono;
		        		ult_fechaHora=fechaHora;
		        		ult_duracion=duracion;
		        		ult_nombre=nombreLlamada;
		        		ult_coste=coste;
	        		
	        		}
	        	}
        		

        		
        	} while (c.moveToNext());
        	
    		//Guardamos los datos de la última llamada en preferencias para que se pueda mostrar en el widget, siempre que el mes que se este mostrado sea el mismo
    		//que es usuario ha seleccionado en ajustes.
    		//QUITAR
    		if (mes==vp.getPreferenciasMes())
    		{
                vp.guardarPreferences(avisoEstadoTelefono.PREF_NUMERO,ult_telefono);
                vp.guardarPreferences(avisoEstadoTelefono.PREF_FECHA, ult_fechaHora);
                vp.guardarPreferences(avisoEstadoTelefono.PREF_DURACION, ult_duracion);
                vp.guardarPreferences(avisoEstadoTelefono.PREF_NOMBRE, ult_nombre);
                vp.guardarPreferences(avisoEstadoTelefono.PREF_COSTE, ""+FunGlobales.redondear(ult_coste*iva, 2));

//    			ult_telefono=telefono;
//        		ult_fechaHora=fechaHora;
//        		ult_duracion=duracion;
//        		ult_nombre=nombreLlamada;
//        		ult_coste=coste;	        		
    		}
        		
        	
        	//Incluimos el resumen de tiempos del último día
        	if (ts.getNumTarifasDefecto()>0)  // hay tarifa por defecto definida (java.lang.NullPointerException)
        		if (ts.getSegConsumidosDia()>1&&vp.getResumenDia()) //Si es igual a 1 seg. que no salga en el resumen del día y esta activado el resumen del día en los ajustes        			
        		{
        			String Festivo="";
        			if (t.esFestivo(fechaControl, vp.getDiasFestivos()))
        			{
        				Festivo="(Fes.)";
        			}
        				lista.add(new IconoYTexto(contexto.getResources().getDrawable(android.R.drawable.presence_away), " "," ", fechaControl+" "+FunGlobales.diaSemana(fechaControl) +Festivo,(ts.getSegConsumidosDia()/60)+"m."+(ts.getSegConsumidosDia()%60)+"s.",FunGlobales.redondear((costeDia*iva),vp.getPreferenciasDecimales())));
					//lista.add(new IconoYTexto(rIcono, " "," ", fechaControl,(t.getSegConsumidosDia()/60)+"m."+(t.getSegConsumidosDia()%60)+"s.",0.0));
        		}
        //c.close();
        }
        
        //Hay que invertir la lista de llamadas, para presentarlo en pantalla y que apareccan
        //for (int a=lista.size()-1;a>=0;a--)
        //	listaInvertida.add(lista.get(a));
        this.totalCosteLlamadas=costeLlamadas;
        this.totalEstablecimiento=totalEstLlamadas;

		Message m=handler.obtainMessage();
		m.arg1=totalLlamadas;
		m.arg2=totalLlamadas;
		this.handler.sendMessage(m);
		
	}
	


}
